﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace TangoFamilyAndGuide.DB
{
    public class Alojamiento : db
    {
        public enum eHorarios
        {
            None,
            DB,
            Lista
        };
        List<Entidades.HorarioFecha> horarios = new List<Entidades.HorarioFecha>();

        public Alojamiento(Entidades.Sesion Sesion)
            : base(Sesion)
        {
        }
        public List<Entidades.Alojamiento> LeerListaAlojamientosPorUsuario()
        {
            List<Entidades.Alojamiento> lista = new List<Entidades.Alojamiento>();
            if (sesion.Usuario.Id != null)
            {
                StringBuilder a = new StringBuilder(string.Empty);
                a.Append("select Alojamiento.IdAlojamiento, Alojamiento.IdUsuario, Alojamiento.Descripcion, Alojamiento.Pais, Alojamiento.Provincia, Alojamiento.Localidad, Alojamiento.Direccion, Alojamiento.CodPost, ");
                a.Append("Alojamiento.NombreContacto, Alojamiento.EmailContacto, Alojamiento.TelefonoContacto, Alojamiento.Comentarios, Alojamiento.GoogleMap, Alojamiento.IdWF, Alojamiento.Estado, Alojamiento.Ranking, Alojamiento.UltActualiz, Alojamiento.TipoDestacado, ");
                a.Append("Alojamiento.Neighborhood, Alojamiento.ApproximateAddress, Alojamiento.SizeSgm, Alojamiento.TypePlace, Alojamiento.TypeRoom, Alojamiento.TypeBathroom, Alojamiento.AlojamientoOffer, Alojamiento.SkypeAddress, Alojamiento.Moneda, Alojamiento.PricePerDay, Alojamiento.PricePerMonth, Alojamiento.PriceComment, Alojamiento.Servicios ");
                a.Append("from Alojamiento where Alojamiento.IdUsuario in (Select Permiso.IdUsuario from Permiso where Permiso.IdTipoPermiso='OperAlojamiento' and Permiso.IdUsuario='" + sesion.Usuario.Id + "' and Permiso.Estado='Active') ");
                DataTable dt = (DataTable)Ejecutar(a.ToString(), TipoRetorno.TB, Transaccion.NoAcepta, sesion.CnnStr);
                if (dt.Rows.Count != 0)
                {
                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        Entidades.Alojamiento Alojamiento = new Entidades.Alojamiento();
                        Alojamiento.Id = Convert.ToInt32(dt.Rows[i]["IdAlojamiento"]);
                        Copiar(dt.Rows[i], Alojamiento);
                        lista.Add(Alojamiento);
                    }
                }
            }
            return lista;
        }
        public void Leer(Entidades.Alojamiento Alojamiento)
        {
            StringBuilder a = new StringBuilder(string.Empty);
            a.Append("select Alojamiento.IdAlojamiento, Alojamiento.IdUsuario, Alojamiento.Descripcion, Alojamiento.Pais, Alojamiento.Provincia, Alojamiento.Localidad, Alojamiento.Direccion, Alojamiento.CodPost, ");
            a.Append("Alojamiento.NombreContacto, Alojamiento.EmailContacto, Alojamiento.TelefonoContacto, Alojamiento.Comentarios, Alojamiento.GoogleMap, Alojamiento.IdWF, Alojamiento.Estado, Alojamiento.Ranking, Alojamiento.UltActualiz, Alojamiento.TipoDestacado, ");
            a.Append("Alojamiento.Neighborhood, Alojamiento.ApproximateAddress, Alojamiento.SizeSgm, Alojamiento.TypePlace, Alojamiento.TypeRoom, Alojamiento.TypeBathroom, Alojamiento.AlojamientoOffer, Alojamiento.SkypeAddress, Alojamiento.Moneda, Alojamiento.PricePerDay, Alojamiento.PricePerMonth, Alojamiento.PriceComment, Alojamiento.Servicios ");
            a.Append("from Alojamiento ");
            a.Append("where Alojamiento.IdAlojamiento = " + Alojamiento.Id + " ");
            DataTable dt = (DataTable)Ejecutar(a.ToString(), TipoRetorno.TB, Transaccion.NoAcepta, sesion.CnnStr);
            if (dt.Rows.Count == 0)
            {
                throw new TangoFamilyAndGuide.EX.Validaciones.ElementoInexistente("Alojamiento " + Alojamiento.Id);
            }
            else
            {
                Copiar(dt.Rows[0], Alojamiento);
            }
        }

        private void Copiar(DataRow Desde, Entidades.Alojamiento Hasta)
        {
            Hasta.Id = Convert.ToInt32(Desde["IdAlojamiento"]);
            Hasta.Usuario.Id = Convert.ToString(Desde["IdUsuario"]);
            Hasta.Descripcion = Convert.ToString(Desde["Descripcion"]);
            Hasta.Pais = Convert.ToString(Desde["Pais"]);
            Hasta.Provincia = Convert.ToString(Desde["Provincia"]);
            Hasta.Localidad = Convert.ToString(Desde["Localidad"]);
            Hasta.Direccion = Convert.ToString(Desde["Direccion"]);
            Hasta.CodPost = Convert.ToString(Desde["CodPost"]);
            Hasta.Contacto.Nombre = Convert.ToString(Desde["NombreContacto"]);
            Hasta.Contacto.Email = Convert.ToString(Desde["EmailContacto"]);
            Hasta.Contacto.Telefono = Convert.ToString(Desde["TelefonoContacto"]);
            Hasta.Comentarios = Convert.ToString(Desde["Comentarios"]);
            Hasta.GoogleMap = Convert.ToString(Desde["GoogleMap"]);
            Hasta.Ranking = Convert.ToInt32(Desde["Ranking"]);
            Hasta.WF.Id = Convert.ToInt32(Desde["IdWF"]);
            Hasta.WF.Estado = Convert.ToString(Desde["Estado"]);
            Hasta.UltActualiz = ByteArray2TimeStamp((byte[])Desde["UltActualiz"]);
            Hasta.TipoDestacado = Convert.ToString(Desde["TipoDestacado"]);
            Hasta.Neighborhood = Convert.ToString(Desde["Neighborhood"]);
            Hasta.ApproximateAddress = Convert.ToString(Desde["ApproximateAddress"]);
            Hasta.SizeSgm = Convert.ToString(Desde["SizeSgm"]);
            Hasta.TypePlace = Convert.ToString(Desde["TypePlace"]);
            Hasta.TypeRoom = Convert.ToString(Desde["TypeRoom"]);
            Hasta.TypeBathroom = Convert.ToString(Desde["TypeBathroom"]);
            Hasta.AlojamientoOffer = Convert.ToString(Desde["AlojamientoOffer"]);
            Hasta.SkypeAddress = Convert.ToString(Desde["SkypeAddress"]);
            Hasta.Moneda = Convert.ToString(Desde["Moneda"]);
            if (!(String.IsNullOrEmpty(Desde["PricePerDay"].ToString())))
            {
                Hasta.PricePerDay = Convert.ToDecimal(Desde["PricePerDay"]);
            }
            if (!(String.IsNullOrEmpty(Desde["PricePerMonth"].ToString())))
            {
                Hasta.PricePerMonth = Convert.ToDecimal(Desde["PricePerMonth"]);
            }
            Hasta.PriceComment = Convert.ToString(Desde["PriceComment"]);
            Hasta.Servicios = Convert.ToString(Desde["Servicios"]);
            Hasta.NombreImagenPortada = "PortadaGral.jpg";
        }
        public int Crear(Entidades.Alojamiento Alojamiento)
        {
            StringBuilder a = new StringBuilder(string.Empty);
            a.AppendLine("declare @idWF varchar(256) ");
            a.AppendLine("declare @idUltimoIdAlojamiento varchar(256) ");
            a.AppendLine("update Configuracion set @idWF=Valor=convert(varchar(256), convert(int, Valor)+1) where IdItemConfig='UltimoIdWF' ");
            a.AppendLine("update Configuracion set @idUltimoIdAlojamiento=Valor=convert(varchar(256), convert(int, Valor)+1) where IdItemConfig='UltimoIdAlojamiento' ");
            a.Append("Insert Alojamiento (IdAlojamiento, IdUsuario, Descripcion, Pais, Provincia, Localidad, Direccion, CodPost, ");
            a.Append("NombreContacto, EmailContacto, TelefonoContacto, Comentarios, GoogleMap, IdWF, Estado, Ranking, TipoDestacado, Neighborhood, ApproximateAddress, SizeSgm, TypePlace, TypeRoom, TypeBathroom, AlojamientoOffer, SkypeAddress, Moneda, PricePerDay, PricePerMonth, PriceComment, Servicios) values (");
            a.Append("@idUltimoIdAlojamiento, ");
            a.Append("'" + Alojamiento.Usuario.Id + "', ");
            a.Append("'" + Alojamiento.Descripcion + "', ");
            a.Append("'" + Alojamiento.Pais + "', ");
            a.Append("'" + Alojamiento.Provincia + "', ");
            a.Append("'" + Alojamiento.Localidad + "', ");
            a.Append("'" + Alojamiento.Direccion + "', ");
            a.Append("'" + Alojamiento.CodPost + "', ");
            a.Append("'" + Alojamiento.Contacto.Nombre + "', ");
            a.Append("'" + Alojamiento.Contacto.Email + "', ");
            a.Append("'" + Alojamiento.Contacto.Telefono + "', ");
            a.Append("'" + Alojamiento.Comentarios + "', ");
            a.Append("'" + Alojamiento.GoogleMap + "', ");
            a.Append("@idWF, ");
            a.Append("'" + Alojamiento.WF.Estado + "', ");
            a.Append(Alojamiento.Ranking + ", ");
            a.Append("'" + Alojamiento.TipoDestacado + "', ");
            a.Append("'" + Alojamiento.Neighborhood + "', ");
            a.Append("'" + Alojamiento.ApproximateAddress + "', ");
            a.Append("'" + Alojamiento.SizeSgm + "', ");
            a.Append("'" + Alojamiento.TypePlace + "', ");
            a.Append("'" + Alojamiento.TypeRoom + "', ");
            a.Append("'" + Alojamiento.TypeBathroom + "', ");
            a.Append("'" + Alojamiento.AlojamientoOffer + "', ");
            a.Append("'" + Alojamiento.SkypeAddress + "', ");
            a.Append("'" + Alojamiento.Moneda + "', ");
            a.Append(Alojamiento.PricePerDay + ", ");
            a.Append(Alojamiento.PricePerMonth + ", ");
            a.Append("'" + Alojamiento.PriceComment + "', ");
            a.Append("'" + Alojamiento.Servicios + "' ");
            a.AppendLine(") ");
            a.AppendLine("insert Log values (@idWF, getdate(), '" + sesion.Usuario.Id + "', 'Alojamiento', 'New', '" + Alojamiento.WF.Estado + "', '') ");
            a.AppendLine("Select @idUltimoIdAlojamiento");
            a.AppendLine();
            DataTable dt = new DataTable();
            dt = (DataTable)Ejecutar(a.ToString(), TipoRetorno.TB, Transaccion.Usa, sesion.CnnStr);
            int resp = 0;
            if (dt.Rows.Count != 0)
            {
                resp = Convert.ToInt32(dt.Rows[0][0].ToString());
            }
            return resp;
        }
        public void Modificar(Entidades.Alojamiento Desde, Entidades.Alojamiento Hasta)
        {
            if (sesion.Usuario.Id != null)
            {
                StringBuilder a = new StringBuilder(string.Empty);
                a.Append("update Alojamiento set ");
                a.Append("IdUsuario = '" + Hasta.Usuario.Id + "', ");
                a.Append("Descripcion = '" + Hasta.Descripcion + "', ");
                a.Append("Pais = '" + Hasta.Pais + "', ");
                a.Append("Provincia = '" + Hasta.Provincia + "', ");
                a.Append("Localidad = '" + Hasta.Localidad + "', ");
                a.Append("Direccion = '" + Hasta.Direccion + "', ");
                a.Append("CodPost = '" + Hasta.CodPost + "', ");
                a.Append("NombreContacto = '" + Hasta.Contacto.Nombre + "', ");
                a.Append("EmailContacto = '" + Hasta.Contacto.Email + "', ");
                a.Append("TelefonoContacto = '" + Hasta.Contacto.Telefono + "', ");
                a.Append("Comentarios = '" + Hasta.Comentarios + "', ");
                a.Append("GoogleMap = '" + Hasta.GoogleMap + "', ");
                a.Append("Ranking = '" + Hasta.Ranking + "', ");
                a.Append("TipoDestacado = '" + Hasta.TipoDestacado + "', ");
                a.Append("Neighborhood = '" + Hasta.TipoDestacado + "', ");
                a.Append("ApproximateAddress = '" + Hasta.ApproximateAddress + "', ");
                a.Append("SizeSgm = '" + Hasta.SizeSgm + "', ");
                a.Append("TypePlace = '" + Hasta.TypePlace + "', ");
                a.Append("TypeRoom = '" + Hasta.TypeRoom + "', ");
                a.Append("TypeBathroom = '" + Hasta.TypeBathroom + "', ");
                a.Append("AlojamientoOffer = '" + Hasta.AlojamientoOffer + "', ");
                a.Append("SkypeAddress = '" + Hasta.SkypeAddress + "', ");
                a.Append("Moneda = '" + Hasta.Moneda + "', ");
                a.Append("PricePerDay = " + Hasta.PricePerDay + ", ");
                a.Append("PricePerMonth = " + Hasta.PricePerMonth + ", ");
                a.Append("PriceComment = '" + Hasta.PriceComment + "', ");
                a.Append("Servicios = '" + Hasta.Servicios + "' ");
                a.Append("where IdAlojamiento = " + Hasta.Id + " ");
                a.AppendLine("delete HorarioFecha where NombreEntidad='Alojamiento' and IdEntidad = " + Hasta.Id + " ");
                a.AppendLine("insert Log values (" + Hasta.WF.Id.ToString() + ", getdate(), '" + sesion.Usuario.Id + "', 'Alojamiento', 'Modif', '" + Hasta.WF.Estado + "', '') ");
                a.AppendLine("declare @idLog int ");
                a.AppendLine("select @idLog=@@Identity ");
                a.AppendLine("insert LogDetalle (IdLog, TipoDetalle, Detalle) values (@idLog, 'Desde', '" + Funciones.ObjetoSerializado(Desde) + "')");
                a.AppendLine("insert LogDetalle (IdLog, TipoDetalle, Detalle) values (@idLog, 'Hasta', '" + Funciones.ObjetoSerializado(Hasta) + "')");
                Ejecutar(a.ToString(), TipoRetorno.None, Transaccion.Usa, sesion.CnnStr);
            }
        }
        public void CambiarEstado(Entidades.Alojamiento Alojamiento, string Evento, string Estado)
        {
            if (sesion.Usuario.Id != null)
            {
                StringBuilder a = new StringBuilder(string.Empty);
                a.Append("update Alojamiento set ");
                a.Append("Estado='" + Estado + "' ");
                a.AppendLine("where IdAlojamiento=" + Alojamiento.Id);
                a.AppendLine("insert Log values (" + Alojamiento.WF.Id.ToString() + ", getdate(), '" + sesion.Usuario.Id + "', 'Alojamiento', '" + Evento + "', '" + Estado + "', '') ");
                Ejecutar(a.ToString(), TipoRetorno.None, Transaccion.Usa, sesion.CnnStr);
            }
        }
        public List<Entidades.Alojamiento> ListaPorIdAlojamiento(int IdAlojamiento, bool SoloPropias)
        {
            List<Entidades.Alojamiento> lista = new List<Entidades.Alojamiento>();
            if (sesion.Usuario.Id != null)
            {
                StringBuilder a = new StringBuilder(string.Empty);
                a.Append("select Alojamiento.IdAlojamiento, Alojamiento.IdUsuario, Alojamiento.Descripcion, Alojamiento.Pais, Alojamiento.Provincia, Alojamiento.Localidad, Alojamiento.Direccion, Alojamiento.CodPost, ");
                a.Append("Alojamiento.NombreContacto, Alojamiento.EmailContacto, Alojamiento.TelefonoContacto, Alojamiento.Comentarios, Alojamiento.GoogleMap, Alojamiento.IdWF, Alojamiento.Estado, Alojamiento.Ranking, Alojamiento.UltActualiz, Alojamiento.TipoDestacado, ");
                a.Append("Alojamiento.Neighborhood, Alojamiento.ApproximateAddress, Alojamiento.SizeSgm, Alojamiento.TypePlace, Alojamiento.TypeRoom, Alojamiento.TypeBathroom, Alojamiento.AlojamientoOffer, Alojamiento.SkypeAddress, Alojamiento.Moneda, Alojamiento.PricePerDay, Alojamiento.PricePerMonth, Alojamiento.PriceComment, Alojamiento.Servicios ");
                a.Append("from Alojamiento where (Alojamiento.IdUsuario in (Select Permiso.IdUsuario from Permiso where Permiso.IdTipoPermiso='OperAlojamiento' and Permiso.IdUsuario='" + sesion.Usuario.Id + "' and Permiso.Estado='Active')");
                if (!SoloPropias)
                {
                    a.Append(" or '" + sesion.Usuario.Id + "' in (Select Permiso.IdUsuario from Permiso where Permiso.IdTipoPermiso='AdminSITE' and Permiso.IdUsuario='" + sesion.Usuario.Id + "' and Permiso.Estado='Active')) ");
                }
                else
                {
                    a.Append(") ");
                }
                a.Append("and IdAlojamiento = " + IdAlojamiento);
                DataTable dt = (DataTable)Ejecutar(a.ToString(), TipoRetorno.TB, Transaccion.NoAcepta, sesion.CnnStr);
                if (dt.Rows.Count != 0)
                {
                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        Entidades.Alojamiento Alojamiento = new Entidades.Alojamiento();
                        Copiar(dt.Rows[i], Alojamiento);
                        lista.Add(Alojamiento);
                    }
                }
            }
            return lista;
        }
        public List<Entidades.Alojamiento> ListaPorDireccion(string Direccion, bool SoloPropias)
        {
            List<Entidades.Alojamiento> lista = new List<Entidades.Alojamiento>();
            if (sesion.Usuario.Id != null)
            {
                if (sesion.Usuario.Id != null)
                {
                    StringBuilder a = new StringBuilder(string.Empty);
                    a.Append("select Alojamiento.IdAlojamiento, Alojamiento.IdUsuario, Alojamiento.Descripcion, Alojamiento.Pais, Alojamiento.Provincia, Alojamiento.Localidad, Alojamiento.Direccion, Alojamiento.CodPost, ");
                    a.Append("Alojamiento.NombreContacto, Alojamiento.EmailContacto, Alojamiento.TelefonoContacto, Alojamiento.Comentarios, Alojamiento.GoogleMap, Alojamiento.IdWF, Alojamiento.Estado, Alojamiento.Ranking, Alojamiento.UltActualiz, Alojamiento.TipoDestacado, ");
                    a.Append("Alojamiento.Neighborhood, Alojamiento.ApproximateAddress, Alojamiento.SizeSgm, Alojamiento.TypePlace, Alojamiento.TypeRoom, Alojamiento.TypeBathroom, Alojamiento.AlojamientoOffer, Alojamiento.SkypeAddress, Alojamiento.Moneda, Alojamiento.PricePerDay, Alojamiento.PricePerMonth, Alojamiento.PriceComment, Alojamiento.Servicios ");
                    a.Append("from Alojamiento where (Alojamiento.IdUsuario in (Select Permiso.IdUsuario from Permiso where Permiso.IdTipoPermiso='OperAlojamiento' and Permiso.IdUsuario='" + sesion.Usuario.Id + "' and Permiso.Estado='Active')");
                    if (!SoloPropias)
                    {
                        a.Append(" or '" + sesion.Usuario.Id + "' in (Select Permiso.IdUsuario from Permiso where Permiso.IdTipoPermiso='AdminSITE' and Permiso.IdUsuario='" + sesion.Usuario.Id + "' and Permiso.Estado='Active')) ");
                    }
                    else
                    {
                        a.Append(") ");
                    }
                    a.Append("and Direccion like '%" + Direccion + "%'");
                    DataTable dt = (DataTable)Ejecutar(a.ToString(), TipoRetorno.TB, Transaccion.NoAcepta, sesion.CnnStr);
                    if (dt.Rows.Count != 0)
                    {
                        for (int i = 0; i < dt.Rows.Count; i++)
                        {
                            Entidades.Alojamiento Alojamiento = new Entidades.Alojamiento();
                            Copiar(dt.Rows[i], Alojamiento);
                            lista.Add(Alojamiento);
                        }
                    }
                }
            }
            return lista;
        }
        public List<Entidades.Alojamiento> ListaPorPais(string Pais, bool SoloPropias)
        {
            List<Entidades.Alojamiento> lista = new List<Entidades.Alojamiento>();
            if (sesion.Usuario.Id != null)
            {
                StringBuilder a = new StringBuilder(string.Empty);
                a.Append("select Alojamiento.IdAlojamiento, Alojamiento.IdUsuario, Alojamiento.Descripcion, Alojamiento.Pais, Alojamiento.Provincia, Alojamiento.Localidad, Alojamiento.Direccion, Alojamiento.CodPost, ");
                a.Append("Alojamiento.NombreContacto, Alojamiento.EmailContacto, Alojamiento.TelefonoContacto, Alojamiento.Comentarios, Alojamiento.GoogleMap, Alojamiento.IdWF, Alojamiento.Estado, Alojamiento.Ranking, Alojamiento.UltActualiz, Alojamiento.TipoDestacado, ");
                a.Append("Alojamiento.Neighborhood, Alojamiento.ApproximateAddress, Alojamiento.SizeSgm, Alojamiento.TypePlace, Alojamiento.TypeRoom, Alojamiento.TypeBathroom, Alojamiento.AlojamientoOffer, Alojamiento.SkypeAddress, Alojamiento.Moneda, Alojamiento.PricePerDay, Alojamiento.PricePerMonth, Alojamiento.PriceComment, Alojamiento.Servicios ");
                a.Append("from Alojamiento where (Alojamiento.IdUsuario in (Select Permiso.IdUsuario from Permiso where Permiso.IdTipoPermiso='OperAlojamiento' and Permiso.IdUsuario='" + sesion.Usuario.Id + "' and Permiso.Estado='Active')");
                if (!SoloPropias)
                {
                    a.Append(" or '" + sesion.Usuario.Id + "' in (Select Permiso.IdUsuario from Permiso where Permiso.IdTipoPermiso='AdminSITE' and Permiso.IdUsuario='" + sesion.Usuario.Id + "' and Permiso.Estado='Active')) ");
                }
                else
                {
                    a.Append(") ");
                }
                a.Append("and Pais like '%" + Pais + "%'");
                DataTable dt = (DataTable)Ejecutar(a.ToString(), TipoRetorno.TB, Transaccion.NoAcepta, sesion.CnnStr);
                if (dt.Rows.Count != 0)
                {
                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        Entidades.Alojamiento Alojamiento = new Entidades.Alojamiento();
                        Copiar(dt.Rows[i], Alojamiento);
                        lista.Add(Alojamiento);
                    }
                }
            }
            return lista;
        }
        public List<Entidades.Alojamiento> ListaCompleta(string OrderBy, string Direccion, string Pais, string Provincia, string Localidad, string Estado)
        {
            List<Entidades.Alojamiento> lista = new List<Entidades.Alojamiento>();
            StringBuilder a = new StringBuilder(string.Empty);
            a.Append("select Alojamiento.IdAlojamiento, Alojamiento.IdUsuario, Alojamiento.Descripcion, Alojamiento.Pais, Alojamiento.Provincia, Alojamiento.Localidad, Alojamiento.Direccion, Alojamiento.CodPost, ");
            a.Append("Alojamiento.NombreContacto, Alojamiento.EmailContacto, Alojamiento.TelefonoContacto, Alojamiento.Comentarios, Alojamiento.GoogleMap, Alojamiento.IdWF, Alojamiento.Estado, Alojamiento.Ranking, Alojamiento.UltActualiz, Alojamiento.TipoDestacado, ");
            a.Append("Alojamiento.Neighborhood, Alojamiento.ApproximateAddress, Alojamiento.SizeSgm, Alojamiento.TypePlace, Alojamiento.TypeRoom, Alojamiento.TypeBathroom, Alojamiento.AlojamientoOffer, Alojamiento.SkypeAddress, Alojamiento.Moneda, Alojamiento.PricePerDay, Alojamiento.PricePerMonth, Alojamiento.PriceComment, Alojamiento.Servicios ");
            a.Append("from Alojamiento where 1=1 ");
            if (!Direccion.Equals(string.Empty))
            {
                a.Append("and Direccion like '%" + Direccion + "%' ");
            }
            if (!Pais.Equals(string.Empty))
            {
                a.Append("and Pais like '%" + Pais + "%' ");
            }
            if (!Provincia.Equals(string.Empty))
            {
                a.Append("and Provincia like '%" + Provincia + "%' ");
            }
            if (!Localidad.Equals(string.Empty))
            {
                a.Append("and Localidad like '%" + Localidad + "%' ");
            }
            if (!Estado.Equals(string.Empty))
            {
                if (!Estado.Equals("All"))
                {
                    a.Append("and Estado like '%" + Estado + "%' ");
                }
            }
            else
            {
                a.Append("and Estado = 'Active' or Estado = 'Reserved' ");
            }
            a.Append("order by " + OrderBy);
            DataTable dt = (DataTable)Ejecutar(a.ToString(), TipoRetorno.TB, Transaccion.NoAcepta, sesion.CnnStr);
            if (dt.Rows.Count != 0)
            {
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    Entidades.Alojamiento Alojamiento = new Entidades.Alojamiento();
                    Copiar(dt.Rows[i], Alojamiento);
                    lista.Add(Alojamiento);
                }
            }
            return lista;
        }
        public List<Entidades.Alojamiento> Lista(int IndicePagina, int TamañoPagina, string OrderBy, string SessionID, List<Entidades.Alojamiento> AlojamientoLista)
        {
            System.Text.StringBuilder a = new StringBuilder();
            a.Append("CREATE TABLE #Alojamiento" + SessionID + "( ");
            a.Append("[IdAlojamiento] [int] NOT NULL, ");
            a.Append("[IdUsuario] [varchar](50) NOT NULL, ");
            a.Append("[Descripcion] [varchar](250) NOT NULL, ");
            a.Append("[Pais] [varchar](50) NOT NULL, ");
            a.Append("[Provincia] [varchar](50) NOT NULL, ");
            a.Append("[Localidad] [varchar](50) NOT NULL, ");
            a.Append("[Direccion] [varchar](60) NOT NULL, ");
            a.Append("[CodPost] [varchar](10) NOT NULL, ");
            a.Append("[NombreContacto] [varchar](25) NOT NULL, ");
            a.Append("[EmailContacto] [varchar](60) NOT NULL, ");
            a.Append("[TelefonoContacto] [varchar](50) NOT NULL, ");
            a.Append("[Comentarios] [varchar](250) NOT NULL, ");
            a.Append("[GoogleMap] [varchar](100) NOT NULL, ");
            a.Append("[IdWF] [int] NOT NULL, ");
            a.Append("[Estado] [varchar](15) NOT NULL, ");
            a.Append("[Ranking] [int] NOT NULL, ");
            a.Append("[TipoDestacado] [varchar](2) NOT NULL, ");
            a.Append("[Neighborhood] varchar(50) not null, ");
            a.Append("[ApproximateAddress] varchar(60) not null, ");
            a.Append("[SizeSgm] int not null, ");
            a.Append("[TypePlace] varchar(50) not null, ");
            a.Append("[TypeRoom] varchar(50) not null, ");
            a.Append("[TypeBathroom] varchar(50) not null, ");
            a.Append("[AlojamientoOffer] varchar(50) not null, ");
            a.Append("[SkypeAddress] varchar(100) not null, ");
            a.Append("[Moneda] varchar(10) not null, ");
            a.Append("[PricePerDay] [numeric](18, 2) NULL, ");
            a.Append("[PricePerMonth] [numeric](18, 2) NULL, ");
            a.Append("[PriceComment] varchar(250) not null, ");
            a.Append("[Servicios] varchar(500) not null, ");
            a.Append("CONSTRAINT [PK_Alojamiento" + SessionID + "] PRIMARY KEY CLUSTERED ");
            a.Append("( ");
            a.Append("[IdAlojamiento] ASC ");
            a.Append(")WITH (PAD_INDEX  = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] ");
            a.Append(") ON [PRIMARY] ");
            foreach (Entidades.Alojamiento Alojamiento in AlojamientoLista)
            {
                a.Append("Insert #Alojamiento" + SessionID + " values (" + Alojamiento.Id + ", '");
                a.Append(Alojamiento.Usuario.Id + "', '");
                a.Append(Alojamiento.Descripcion + "', '");
                a.Append(Alojamiento.Pais + "', '");
                a.Append(Alojamiento.Provincia + "', '");
                a.Append(Alojamiento.Localidad + "', '");
                a.Append(Alojamiento.Direccion + "', '");
                a.Append(Alojamiento.CodPost + "', '");
                a.Append(Alojamiento.Contacto.Nombre + "', '");
                a.Append(Alojamiento.Contacto.Email + "', '");
                a.Append(Alojamiento.Contacto.Telefono + "', '");
                a.Append(Alojamiento.Comentarios + "', '");
                a.Append(Alojamiento.GoogleMap + "', ");
                a.Append(Alojamiento.WF.Id + ", '");
                a.Append(Alojamiento.Estado + "', ");
                a.Append(Alojamiento.Ranking + ", '");
                a.Append(Alojamiento.TipoDestacado + "', '");
                a.Append(Alojamiento.Neighborhood + "', '");
                a.Append(Alojamiento.ApproximateAddress + "', ");
                a.Append(Alojamiento.SizeSgm + ", '");
                a.Append(Alojamiento.TypePlace + "', '");
                a.Append(Alojamiento.TypeRoom + "', '");
                a.Append(Alojamiento.TypeBathroom + "', '");
                a.Append(Alojamiento.AlojamientoOffer + "', '");
                a.Append(Alojamiento.SkypeAddress + "', '");
                a.Append(Alojamiento.Moneda + "', ");
                a.Append(Alojamiento.PricePerDay + ", ");
                a.Append(Alojamiento.PricePerMonth + ", '");
                a.Append(Alojamiento.PriceComment + "', '");
                a.Append(Alojamiento.Servicios + "') ");
            }
            a.Append("select * ");
            a.Append("from (select top {0} ROW_NUMBER() OVER (ORDER BY {1}) as ROW_NUM, ");
            a.Append("IdAlojamiento, IdUsuario, Descripcion, Pais, Provincia, Localidad, Direccion, CodPost, ");
            a.Append("NombreContacto, EmailContacto, TelefonoContacto, Comentarios, GoogleMap, IdWF, Estado, Ranking, TipoDestacado, ");
            a.Append("Neighborhood, ApproximateAddress, SizeSgm, TypePlace, TypeRoom, TypeBathroom, AlojamientoOffer, SkypeAddress, Moneda, PricePerDay, PricePerMonth, PriceComment, Servicios ");
            a.Append("from #Alojamiento" + SessionID + " ");
            a.Append("ORDER BY ROW_NUM) innerSelect WHERE ROW_NUM > {2} ");
            a.Append("DROP TABLE #Alojamiento" + SessionID);
            if (OrderBy.Trim().ToUpper() == "DIRECCION" || OrderBy.Trim().ToUpper() == "DIRECCION DESC" || OrderBy.Trim().ToUpper() == "DIRECCION ASC")
            {
                OrderBy = "#Alojamiento" + SessionID + "." + OrderBy;
            }
            if (OrderBy.Trim().ToUpper() == "PAIS" || OrderBy.Trim().ToUpper() == "PAIS DESC" || OrderBy.Trim().ToUpper() == "PAIS ASC")
            {
                OrderBy = "#Alojamiento" + SessionID + "." + OrderBy;
            }
            string commandText = string.Format(a.ToString(), ((IndicePagina + 1) * TamañoPagina), OrderBy, (IndicePagina * TamañoPagina));
            DataTable dt = new DataTable();
            dt = (DataTable)Ejecutar(commandText.ToString(), TipoRetorno.TB, Transaccion.NoAcepta, sesion.CnnStr);
            List<Entidades.Alojamiento> lista = new List<Entidades.Alojamiento>();
            if (dt.Rows.Count != 0)
            {
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    Entidades.Alojamiento Alojamiento = new Entidades.Alojamiento();
                    Alojamiento.Id = Convert.ToInt32(dt.Rows[i]["IdAlojamiento"].ToString());
                    Alojamiento.Usuario.Id = dt.Rows[i]["IdUsuario"].ToString();
                    Alojamiento.Descripcion = dt.Rows[i]["Descripcion"].ToString();
                    Alojamiento.Pais = dt.Rows[i]["Pais"].ToString();
                    Alojamiento.Provincia = dt.Rows[i]["Provincia"].ToString();
                    Alojamiento.Localidad = dt.Rows[i]["Localidad"].ToString();
                    Alojamiento.Direccion = dt.Rows[i]["Direccion"].ToString();
                    Alojamiento.CodPost = dt.Rows[i]["CodPost"].ToString();
                    Alojamiento.Contacto.Nombre = dt.Rows[i]["NombreContacto"].ToString();
                    Alojamiento.Contacto.Email = dt.Rows[i]["EmailContacto"].ToString();
                    Alojamiento.Contacto.Telefono = dt.Rows[i]["TelefonoContacto"].ToString();
                    Alojamiento.Comentarios = dt.Rows[i]["Comentarios"].ToString();
                    Alojamiento.GoogleMap = dt.Rows[i]["GoogleMap"].ToString();
                    Alojamiento.WF.Id = Convert.ToInt32(dt.Rows[i]["IdWF"].ToString());
                    Alojamiento.WF.Estado = dt.Rows[i]["Estado"].ToString();
                    Alojamiento.Ranking = Convert.ToInt32(dt.Rows[i]["Ranking"].ToString());
                    Alojamiento.TipoDestacado = dt.Rows[i]["TipoDestacado"].ToString();
                    Alojamiento.Neighborhood = Convert.ToString(dt.Rows[i]["Neighborhood"]);
                    Alojamiento.ApproximateAddress = Convert.ToString(dt.Rows[i]["ApproximateAddress"]);
                    Alojamiento.SizeSgm = Convert.ToString(dt.Rows[i]["SizeSgm"]);
                    Alojamiento.TypePlace = Convert.ToString(dt.Rows[i]["TypePlace"]);
                    Alojamiento.TypeRoom = Convert.ToString(dt.Rows[i]["TypeRoom"]);
                    Alojamiento.TypeBathroom = Convert.ToString(dt.Rows[i]["TypeBathroom"]);
                    Alojamiento.AlojamientoOffer = Convert.ToString(dt.Rows[i]["AlojamientoOffer"]);
                    Alojamiento.SkypeAddress = Convert.ToString(dt.Rows[i]["SkypeAddress"]);
                    Alojamiento.Moneda = Convert.ToString(dt.Rows[i]["Moneda"]);
                    if (!(String.IsNullOrEmpty(dt.Rows[i]["PricePerDay"].ToString())))
                    {
                        Alojamiento.PricePerDay = Convert.ToDecimal(dt.Rows[i]["PricePerDay"]);
                    }
                    if (!(String.IsNullOrEmpty(dt.Rows[i]["PricePerMonth"].ToString())))
                    {
                        Alojamiento.PricePerMonth = Convert.ToDecimal(dt.Rows[i]["PricePerMonth"]);
                    }
                    Alojamiento.PriceComment = Convert.ToString(dt.Rows[i]["PriceComment"]);
                    Alojamiento.Servicios = Convert.ToString(dt.Rows[i]["Servicios"]);
                    Alojamiento.NombreImagenPortada = "PortadaGral.jpg";
                    lista.Add(Alojamiento);
                }
            }
            return lista;
        }
        public bool ComprobarDireccionAlojamiento(string Direccion)
        {
            bool resp = false;
            StringBuilder a = new StringBuilder(string.Empty);
            a.Append("select Alojamiento.IdAlojamiento, Alojamiento.IdUsuario, Alojamiento.Descripcion, Alojamiento.Pais, Alojamiento.Provincia, Alojamiento.Localidad, Alojamiento.Direccion, Alojamiento.CodPost, ");
            a.Append("Alojamiento.NombreContacto, Alojamiento.EmailContacto, Alojamiento.TelefonoContacto, Alojamiento.Comentarios, Alojamiento.GoogleMap, Alojamiento.IdWF, Alojamiento.Estado, Alojamiento.Ranking, Alojamiento.UltActualiz, Alojamiento.TipoDestacado, ");
            a.Append("Alojamiento.Neighborhood, Alojamiento.ApproximateAddress, Alojamiento.SizeSgm, Alojamiento.TypePlace, Alojamiento.TypeRoom, Alojamiento.TypeBathroom, Alojamiento.AlojamientoOffer, Alojamiento.SkypeAddress, Alojamiento.Moneda, Alojamiento.PricePerDay, Alojamiento.PricePerMonth, Alojamiento.PriceComment, Alojamiento.Servicios ");
            a.Append("from Alojamiento where ");
            a.Append("Direccion like '%" + Direccion + "%'");
            DataTable dt = (DataTable)Ejecutar(a.ToString(), TipoRetorno.TB, Transaccion.NoAcepta, sesion.CnnStr);
            if (dt.Rows.Count != 0)
            {
                resp = true;
            }
            return resp;
        }
        public bool EstaReservado(int IdAlojamiento)
        {
            bool resp = false;
            StringBuilder a = new StringBuilder(string.Empty);
            a.Append("select Alojamiento.IdAlojamiento, Alojamiento.IdUsuario, Alojamiento.Descripcion, Alojamiento.Pais, Alojamiento.Provincia, Alojamiento.Localidad, Alojamiento.Direccion, Alojamiento.CodPost, ");
            a.Append("Alojamiento.NombreContacto, Alojamiento.EmailContacto, Alojamiento.TelefonoContacto, Alojamiento.Comentarios, Alojamiento.GoogleMap, Alojamiento.IdWF, Alojamiento.Estado, Alojamiento.Ranking, Alojamiento.UltActualiz, Alojamiento.TipoDestacado, ");
            a.Append("Alojamiento.Neighborhood, Alojamiento.ApproximateAddress, Alojamiento.SizeSgm, Alojamiento.TypePlace, Alojamiento.TypeRoom, Alojamiento.TypeBathroom, Alojamiento.AlojamientoOffer, Alojamiento.SkypeAddress, Alojamiento.Moneda, Alojamiento.PricePerDay, Alojamiento.PricePerMonth, Alojamiento.PriceComment, Alojamiento.Servicios ");
            a.Append("from Alojamiento where ");
            a.Append("IdAlojamiento = " + IdAlojamiento + " and Estado = 'Reserved'");
            DataTable dt = (DataTable)Ejecutar(a.ToString(), TipoRetorno.TB, Transaccion.NoAcepta, sesion.CnnStr);
            if (dt.Rows.Count != 0)
            {
                resp = true;
            }
            return resp;
        }
        public int Reservar(Entidades.Alojamiento Alojamiento, string Evento, string Estado)
        {
            int cant = 0;
            if (sesion.Usuario.Id != null)
            {
                StringBuilder a = new StringBuilder(string.Empty);
                a.Append("declare @Cantidad int ");
                a.AppendLine("select @Cantidad=Count(*) from Alojamiento where IdAlojamiento = " + Alojamiento.Id + " and Estado = 'Active'");
                a.AppendLine("if @Cantidad > 0 ");
                a.AppendLine("begin ");
                a.AppendLine("update Alojamiento set Estado='" + Estado + "' where IdAlojamiento = " + Alojamiento.Id);
                a.AppendLine("insert Log values (" + Alojamiento.WF.Id.ToString() + ", getdate(), '" + sesion.Usuario.Id + "', 'Alojamiento', '" + Evento + "', '" + Estado + "', '') ");
                a.AppendLine("end ");
                a.AppendLine("select @Cantidad ");
                cant = Convert.ToInt32(((DataTable)Ejecutar(a.ToString(), TipoRetorno.TB, Transaccion.Usa, sesion.CnnStr)).Rows[0][0]);
            }
            return cant;
        }
    }
}
